//
//  ShowTableViewViewController.swift
//  SwiftRx研究
//
//  Created by 世霖 on 2020/7/16.
//  Copyright © 2020 世霖. All rights reserved.
//

import UIKit
import RxSwift
import RxCocoa
import RxDataSources


class ShowTableViewViewController: UIViewController {

    var tableView:UITableView!
    let disposeBag = DisposeBag()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //创建表格视图
        self.tableView = UITableView(frame: self.view.frame, style:.plain)
        //创建一个重用的单元格
        self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        self.view.addSubview(self.tableView!)
//        //初始化数据
//             let items = Observable.just([
//                 "文本输入框的用法",
//                 "开关按钮的用法",
//                 "进度条的用法",
//                 "文本标签的用法",
//                 ])
//        //设置单元格数据（其实就是对 cellForRowAt 的封装）
//           items
//               .bind(to: tableView.rx.items) { (tableView, row, element) in
//                   let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
//                   cell.textLabel?.text = "\(row)：\(element)"
//                   return cell
//               }
//               .disposed(by: disposeBag)
//
////        获取选中项
//        tableView.rx.itemSelected.subscribe(onNext: { indexPath in
//
//            }).disposed(by: disposeBag)
//
////        获取选中的内容 .可以在内部，也可以在外部使用
//        tableView.rx.modelSelected(String.self).subscribe(onNext: {[weak self ] item  in
//            print(item)
//        })
//        .disposed(by: disposeBag)
//
//
////        3:单元格选中取消状态
//
//        tableView.rx.modelDeselected(String.self).subscribe(onNext: { [weak self ] item   in
//
//        })
//        .disposed(by: disposeBag)
//
////        获取删除项的多音
//        tableView.rx.itemDeleted.subscribe(onNext: { [weak self ]  indexPath  in
//
//            }).disposed(by: disposeBag)
//
////        获取删除项的内容
//        tableView.rx.modelDeselected(String.self).subscribe(onNext: { [weak self ] item   in
//
//        })
//        .disposed(by: disposeBag)
//
//
////        单元格移动和插入数据
//
        ////        RxDataSources 是以 section 来做为数据结构的。所以不管我们的 tableView 是单分区还是多分区，在使用 RxDataSources 的过程中，都需要返回一个 section 的数组。
        
        let items  = Observable.just( [
            SectionModel(model: "基本控件", items: [
                "uila"
            ]),
            SectionModel(model: "基本控件2", items: [
                "uila"
            ])
            
            
        ]  )
        
        
        
        let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String , String  >>(configureCell:   { (dataSource ,tv ,indexpath , element) in
            
            let cell = tv.dequeueReusableCell(withIdentifier: "cell")
            return cell!
        })
        
        
//        设置请求头
        dataSource.titleForHeaderInSection = { ds , index in
            return ds.sectionModels[index].model
        }
        
        
        items.bind(to: tableView.rx.items(dataSource: dataSource))
        .disposed(by: disposeBag)
        
        
//        使用自定义section'
        let sections = Observable.just([
        MySection(header: "基本控件", items: [
                     "UILable的用法",
                     "UIText的用法",
                     "UIButton的用法"
                     ]),
                 MySection(header: "高级控件", items: [
                     "UITableView的用法",
                     "UICollectionViews的用法"
                     ])
        ])
        
        
        let dataSourcess = RxTableViewSectionedAnimatedDataSource<MySection> (
//            设置单元格
            configureCell: { ds , tv ,ip , item     in
                
                let cell = tv.dequeueReusableCell(withIdentifier: "Cell")
                        ?? UITableViewCell(style: .default, reuseIdentifier: "Cell")
                    cell.textLabel?.text = "\(ip.row)：\(item)"
                     
                    return cell
                },
                //设置分区头标题
                titleForHeaderInSection: { ds, index in
                    return ds.sectionModels[index].header
                }
            
        )
        
        
        //绑定单元格数据
               sections
                   .bind(to: tableView.rx.items(dataSource: dataSourcess))
                   .disposed(by: disposeBag)
        
    }
}

struct MySection {
    var header: String
    var items: [Item]
}
 
extension MySection : AnimatableSectionModelType {
    typealias Item = String
     
    var identity: String {
        return header
    }
     
    init(original: MySection, items: [Item]) {
        self = original
        self.items = items
    }
}
